今回もこのデータを使う
library("readxl")
df <- read_excel("classes.xlsx") # エクセル読み込み
head(df)## # A tibble: 6 x 5
## クラス 名前 英語 現文 数学
## <chr> <chr> <dbl> <dbl> <dbl>
## 1 B 逢坂 77 67 61
## 2 A 荻窪 90 86 89
## 3 A 茅原 79 81 75
## 4 B 金元 76 75 61
## 5 C 原田 67 66 57
## 6 A 佐倉 72 84 79
グラフの描画で役立つパッケージを紹介する
{ggplot2}というグラフの描画用パッケージは綺麗なグラフを描くことができる。
ggplotは次のように2つ以上の手順をとり,2つ以上の関数を+でつなげていき,レイヤーを重ねるように描画していく。
ggplot(データフレーム, aes(x, y)))geom_histogram()などgeom_なんたらという関数)# パッケージ読み込み
library(tidyverse) # ggplot2もtidyverseパッケージに含まれている
# 棒グラフをつくり,gに代入する
g <- ggplot(df, aes(x = クラス)) + # dfのデータでキャンバスを作る
geom_bar() # キャンバスに棒グラフgeom_bar()を重ねる
g # 表示{plotly}パッケージは動的なグラフ(マウスを乗せると情報が表示されたりするグラフ)を描くことができる。
ggplotly()関数を使うと,{ggplot2}で描いたグラフを動的なものに変換できる。
install.packages("plotly")library(plotly)
ggplotly(g) # ggplot2のグラフをplotlyのグラフへ変換データの分布を要約するための指標(要約統計量)の代表的なものが平均(mean)と分散(variance)である。
\[ \bar{x} = \frac{1}{n}\sum_{i=1}^n x_i \]
\[ \sigma^2=\frac{1}{n}\sum_{i=1}^{n}(x_i-\bar{x})^2 \]
ただし,Rのvar()関数は抽出された標本で計算する分散であることに対する修正を加えている不偏分散というものである。
\[ s^2=\frac{1}{n-1}\sum_{i=1}^{n}(x_i-\bar{x})^2 \]
# 不偏分散
var(df$英語)## [1] 85.4609
分散は2乗しているので,それを元の単位に戻すために平方根をとったものが標準偏差(standard deviation)である。
# 不偏標準偏差
sd(df$英語)## [1] 9.244506
summary()関数は,データフレームの各行に関する代表値などの情報を取得することができる関数である。
summary(df)## クラス 名前 英語 現文
## Length:40 Length:40 Min. :45.00 Min. :57.00
## Class :character Class :character 1st Qu.:64.75 1st Qu.:67.00
## Mode :character Mode :character Median :68.00 Median :71.50
## Mean :68.97 Mean :72.72
## 3rd Qu.:76.00 3rd Qu.:79.25
## Max. :90.00 Max. :86.00
## 数学
## Min. :52.00
## 1st Qu.:62.50
## Median :71.00
## Mean :70.17
## 3rd Qu.:77.50
## Max. :89.00
「クラス」と「名前」は文字列(character)型なので,Length(行数,標本数)が40であることくらいしか表示されない。
「英語」「現文」「数学」は整数(integer)型なので,代表値などの要約統計量(summary statistics)が表示されている。
それぞれの統計量の意味は
Min.が最小値1st Qu.が第一四分位数(1st quantile):「データを小さいものから順に並べた時に標本数の4分の1の位置(下位25%)にくる値」Medianが中央値(median):「データを小さい順に並べた時に標本数の2分の1の位置にくる値」Meanが平均値(mean):「データの総計をデータの個数で割ったもの」\(\sum_{i=1}^n x_i/n\)3rd Qu.が第三四分位数(3rd quantile):「データを小さい順に並べた時に標本数の4分の3の位置(75%)にくる値」Max.が最大値である。これらのうちMean以外の5つの統計量をまとめて五数要約という。
平均値は外れ値(極端に高かったり低かったりする値)の影響を受けやすいため,これらの統計量を見ることで,中央値と平均値が大きく異なるデータは外れ値があったりデータの分布に歪みがあることが推測できるわけである。
相関係数(correlation coefficient)は2つの量的変数の直線的な関係の強さを測るもので,次の式で定義される
\[ \begin{align} x\text{と}y\text{の相関係数}r &= \frac{x\text{と}y\text{の共分散}}{x\text{の標準偏差}\times y\text{の標準偏差}} \\ &= \frac{\frac{1}{n} \sum_{i=1}^n (x_i - \bar{x})(y_i - \bar{y})} {\sqrt{\frac{1}{n} \sum_{i=1}^n (x_i - \bar{x})^2} \sqrt{\frac{1}{n} \sum_{i=1}^n (y_i - \bar{y})^2}} \end{align} \]
Rではcor()で計算できる。相関係数は-1から+1の範囲の値をとり,絶対値で1に近いほど関係が強いことを示す。
cor(x = df$英語, y = df$数学)## [1] 0.5304525
相関係数が入った行列を相関行列という
cor(df[,3:5])## 英語 現文 数学
## 英語 1.0000000 0.4926505 0.5304525
## 現文 0.4926505 1.0000000 0.7328408
## 数学 0.5304525 0.7328408 1.0000000
ヒストグラムは量的変数の分布を確認するには極めて有用なグラフである。
# ヒストグラム
ggplot(df, aes(x = 英語)) +
geom_histogram(bins = 10) # binsは棒の数。指定しない場合はbins=30になるR本体の機能でヒストグラムを描く場合はhist()を使う
# ヒストグラム
hist(x = df[["数学"]])# ggplotの棒グラフ
ggplot(df, aes(x = クラス))+
geom_bar()2変数でグラフを描く場合,キャンバスにx(グラフ横軸)とy(グラフ縦軸)の両方を指定する。
そして散布図を描く場合はgeom_point()を+でつなげればよい
ggplot(df, aes(x = 英語, y = 現文))+
geom_point()折れ線グラフはgeom_line()で描くことができる。
Excelで言うところの「マーカー付き折れ線グラフ」にしたい場合はgeom_point()を重ねればよい。
ggplot(df, aes(x = 英語, y = 現文))+
geom_line()+ # 折れ線
geom_point() # マーカー上では説明の簡単のため散布図と同じデータを使ったが,折れ線グラフは本来は時系列データに使うのが望ましい。
そこで,以下ではRにあらかじめ収録されている練習用のデータセットのひとつであるlongleyを使った例をのせる。
このデータは1947~62年のアメリカのGNPや雇用者数などが収録されている(詳細はhelpを参照してほしい)。
head(longley)## GNP.deflator GNP Unemployed Armed.Forces Population Year Employed
## 1947 83.0 234.289 235.6 159.0 107.608 1947 60.323
## 1948 88.5 259.426 232.5 145.6 108.632 1948 61.122
## 1949 88.2 258.054 368.2 161.6 109.773 1949 60.171
## 1950 89.5 284.599 335.1 165.0 110.929 1950 61.187
## 1951 96.2 328.975 209.9 309.9 112.075 1951 63.221
## 1952 98.1 346.999 193.2 359.4 113.270 1952 63.639
ggplot(longley, aes(x = Year, y = GNP))+
geom_line()+ # 折れ線
geom_point()+ # マーカー
labs(title = "1947~62年のアメリカのGNP")箱ひげ図は五数要約の統計量(最小値,第一四分位数,中央値,第三四分位数,最大値)をプロットすることで分布の概形を表示する図である。
g <- ggplot(df, aes(x = クラス, y = 現文))+
geom_boxplot()+
labs(title = "クラスごとの現文の点数の分布")
ggplotly(g)ggplot()関数の中に入れるaes()関数のfillやcolorといった引数に質的変数を指定することで,色の塗り分けによる層別化ができる。
これにより3つ目の変数の情報を表現できる。
ggplot(df, aes(x = 英語, y = 現文, fill = クラス, color = クラス))+
geom_point()+
labs(title = "英語と現文の得点の散布図をクラスごとに塗り分けたもの")